package com.hmk.blogboot.service.Impl;

import com.hmk.blogboot.dao.CommentRepository;
import com.hmk.blogboot.po.Comment;
import com.hmk.blogboot.service.CommentService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentServiceImpl  implements CommentService {


    //自动注入CommentRepository接口
    @Autowired
    private CommentRepository commentRepository;

    //根据blogId获取当前blog博客下的评论
    @Override
    public List<Comment> listCommentByBlogId(Long blogId) {
        //创建Sort对象进行获取到的评论列表进行排序
        Sort sort = Sort.by("createTime");
        //使用dao接口根据blogid获取由createTime字段已经排序评论列表
        List<Comment> comments = commentRepository.findByBlogIdAndParentCommentNull(blogId, sort);
        return eachComment(comments) ;
    }

    //输入评论列表进行循环操作  每个顶级评论得节点
    public List<Comment> eachComment(List<Comment> comments){
        //创建空的存储comment评论对象的容器
        List<Comment> commentView = new ArrayList<>();
        //循环遍历comments列表
        for (Comment comment : comments) {
            //初始化comment对象
            Comment c = new Comment();
            //使用spring提供BeanUtils工具类进行  将遍历的comment对象属性复制给初始化Comment对象c
            BeanUtils.copyProperties(comment,c);
            //存储list容器
            commentView.add(c);
        }
        //进行合并评论到各层子代第一级子代集合中
        combineChildren(commentView);
        return commentView;


    }

    //root根节点 blog不为空的对象集合
    private void combineChildren(List<Comment> comments){
        //循环遍历comments
        for(Comment comment : comments){
            //创建存储comment容器 将评论下每个回复添加各自的list<Comment>容器中
            List<Comment> replys1 = comment.getReplyComment();
            //循环遍历每一个评论下的回复
            for (Comment reply1: replys1) {
                //循环迭代，找出子代，存放在tempReplys中
                recursively(reply1);
            }
            //修改顶级节点的reply集合为迭代处理后的集合
            comment.setReplyComment(tempReplys);
            //清除临时存放区 赋值空的容器的对象
            tempReplys = new ArrayList<>();
        }

    }

    //定义temReplys对象存储迭代的所有子代的集合
    private List<Comment> tempReplys = new ArrayList<>();

    //循环迭代，找出子代，存放在tempReplys中
    private void recursively(Comment comment){
        tempReplys.add(comment);
        //如果存储迭代集合里面you'有元素
        if(comment.getReplyComment().size()>0){
            //获取每一个子评论回复
            List<Comment> replys = comment.getReplyComment();
            //循环遍历
            for(Comment reply : replys){
                tempReplys.add(reply);
                if(reply.getReplyComment().size()>0){
                    //递归调用
                    recursively(reply);
                }
            }
        }
        }


    //保存评论数据到数据库中
    @Override
    public Comment saveComment(Comment comment) {
        //获取当前评论作为parentCommentId值赋值到给parentCommentId
        Long parentCommentId = comment.getParentComment().getId();
        if(parentCommentId != -1){
            //如果parentComment不等于-1 ，当前评论不是顶级评论，有上一级
            //当前评论的父级评论设置到当前评论的ParentComment中
            comment.setParentComment(commentRepository.getOne(parentCommentId));

        }else{
            //该评论为顶级评论没有parentComment 就把该评论的parentComment设置为null,说明为顶级
            comment.setParentComment(null);
        }
        comment.setCreateTime(new Date());
        //把当前的评论保存到数据库中
        return commentRepository.save(comment);
    }
}
